/**
 * @(#)EmpleadosManager.java Apr 19, 2007
 *
 * Copyright (c) 2005-2010 Psiqueware S.A. de C.V. All Rights Reserved.
 * This software is the proprietary information Psiqueware S.A. de C.V.
 * Use is subject to license terms.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *
 * <br/>Usuario : Psique
 * <br/>Creaci&oacute;n: Apr 19, 2007 - 4:17:26 PM
 * <br/>
 * <br/>
 * <br/><t5>Cambios :</t5>
 * <br/><b>Fecha | Autor  |  Cambios</b>
 * <ul>
 * <li>Apr 19, 2007 | <a href = "mailto:AngelElectrico@PsiqueWare.com">Psique</a> | Creaci&oacute;n del Objeto.</li>
 *
 * </ul>
 */

package com.psiqueware.jazmin.empresas.recursos.humanos;

import com.psiqueware.alheli.dao.EnlaceTransaccional;
import com.psiqueware.alheli.manager.BaseManagerInterface;
import com.psiqueware.alheli.manager.ManagerException;
import com.psiqueware.alheli.seguridad.Actividad;
import com.psiqueware.alheli.seguridad.SeguridadManagerFactory;
import com.psiqueware.jazmin.empresas.recursos.financieros.CentroCostos;
import com.psiqueware.jazmin.empresas.recursos.materiales.Ubicacion;
import com.psiqueware.tulipan.cargos.Cargo;
import com.psiqueware.tulipan.organizacional.Estructura;
import com.psiqueware.tulipan.personas.PersonaFisica;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Locale;

/**
 * Encargado de contratar empleados.
 * <br/>Paquete Original: com.psiqueware.laVIE.empresas.recursos.humanos
 * <br/>Nombre  Original: EmpleadosManager
 * <br/>Oprima para ver : <a href="EmpleadosManager.java.html"><i>C&oacute;digo Fuente</i> </a>
 *
 * @author <a href="mailto:AngelElectrico@PsiqueWare.com">Psique</a>
 * @version Revision: 1.1 Apr 19, 2007 4:17:26 PM
 */
public interface EmpleadosManager extends BaseManagerInterface
{

    /** {@link Actividad} cuyo {@link Permiso} se encarga de decir si se pueden cambiar los atributos de los empleados o no. */
    public static Actividad s_liderearEmpleados = SeguridadManagerFactory.getActividad ( "Capacidad para cambiar los atributos de un Empleado.", EmpleadosManager.class );

    /**
     * Busca a todos los {@link Empleado}s para un {@link Departamento} y los lista.
     *
     * @param estructura        a donde pertenecen los {@link Empleado}s.
     * @param enlaceTransaccional para asegurar la atomicidad de la transacci&oacute;n.
     *
     * @return una {@link List} de {@link Empleado}; vacia en caso de no existir ninguno.
     *
     * @exception com.psiqueware.alheli.manager.ManagerException
     *             en caso de no poder completar la operaci&oacute;n.
     */
    List<Empleado> buscarEmpleadosPorEstructura ( Estructura estructura, EnlaceTransaccional enlaceTransaccional ) throws ManagerException;

    /**
     * Le asigna a un {@link Empleado} una {@link Ubicacion}, {@link CentroCostos} y {@link Departamento}.
     *
     * @param gerente             que realiza la asignaci&oacute;n. Debe tener su cargo inicializado; adem&aacute;s necesita permisos para la {@link Actividad} EmpleadosManagerK#s_liderearEmpleados.
     *                            Si la {@link Credencial} del {@link Cargo} no esta cargada ser&aacute; cargada por el m&eacute;todo.
     * @param empleado            que va a ser asignado. Necesita tener su cargo inicializado.
     *                            Si la {@link Credencial} del {@link Cargo} no esta cargada ser&aacute; cargada por el m&eacute;todo.
     * @param ubicacion           a donde se le va a asignar. No puede ser <code>null</code>.
     * @param centroCostos        a donde se va a cobrar el {@link Empleado}.
     * @param estructura        donde va a trabajar.
     * @param enlaceTransaccional para asegurar la atomicidad de la transacci&oacute;n.
     *
     * @return nueva {@link Asignacion}.
     *
     * @exception com.psiqueware.alheli.manager.ManagerException
     *             en caso de no poder completar la operaci&oacute;n.
     * @noinspection OverlyComplexMethod
     */
    Asignacion asignarEmpleado ( Empleado gerente, Empleado empleado, Ubicacion ubicacion, CentroCostos centroCostos, Estructura estructura, EnlaceTransaccional enlaceTransaccional ) throws ManagerException;

    /**
     * Le da un contrato a una {@link PersonaFisica} para que sea un {@link Empleado} de dicho {@link Departamento}.
     *
     * @param estructura        donde va a trabajar esta {@link Persona}. Debe encontrarse persistido.
     * @param trabajador          {@link PersonaFisica} que requiere el {@link Empleado}. Debe encontrarse persistida.
     * @param sueldo              {@link Sueldo} que se le va a pagar por el {@link Empleado}.
     * @param estatusLaboral      {@link EstatusLaboral} actual.
     * @param enlaceTransaccional para asegurar la atomicidad de la transacci&oacute;n.
     * @param contrato            acuerdo para el trabajador en su relaci&oacute;n con la Empresa.
     *
     * @return Empleado persistido con la informaci&oacute;n correcta.
     *
     * @exception com.psiqueware.alheli.manager.ManagerException
     *             en caso de no poder completar la operaci&oacute;n.
     * @noinspection MethodWithTooManyParameters,OverlyComplexMethod,OverlyLongMethod
     */
    Empleado contratar ( Estructura estructura, PersonaFisica trabajador, Contrato contrato, Sueldo sueldo, EstatusLaboral estatusLaboral, EnlaceTransaccional enlaceTransaccional ) throws ManagerException;

    /**
     * Le asigna un {@link Cargo} a un {@link Empleado}.
     *
     * @param gerente             que autoriza la operaci&oacute;n.
     * @param empleado            al que se le va a asignar el {@link Cargo}. Debe encontrarse previamente persistido.
     * @param claveCargo          cadena con la clave para crear el {@link Cargo} que va a desempe&ntilde;ar este {@link Empleado}.
     * @param enlaceTransaccional para asegurar la atomicidad de la transacci&oacute;n.
     *
     * @return {@link Cargo} si puede crearlo; <code>null</code> en caso contrario.
     *
     * @exception com.psiqueware.alheli.manager.ManagerException
     *             en caso de no poder completar la operaci&oacute;n.
     * @noinspection BooleanMethodNameMustStartWithQuestion
     */
    Cargo asignarCargo ( Empleado gerente, Empleado empleado, String claveCargo, EnlaceTransaccional enlaceTransaccional ) throws ManagerException;

    /**
     * Establece la fecha de baja de un {@link Empleado}.
     *
     * @param empleado            cuya fecha de baja se pretende establecer. Debe estar previamente persistido.
     * @param fechaBaja           fecha para la baja del empleado. No puede ser nula y debe ser mayor a su fecha de alta.
     * @param enlaceTransaccional para asegurar la atomicidad de la transacci&oacute;n.
     *
     * @exception com.psiqueware.alheli.manager.ManagerException
     *             en caso de no poder completar la operaci&oacute;n.
     */
    void establecerFechaBajaEmpleo ( Empleado empleado, Date fechaBaja, EnlaceTransaccional enlaceTransaccional ) throws ManagerException;

    /**
     * Aumenta (o disminuye) el {@link Sueldo} de un {@link Empleado}.
     * En caso de tenerse un {@link Sueldo} anterior este es eliminado.
     *
     * @param cantidad            a pagar por un mes de trabajo.
     * @param razonSueldo         raz&oacute;n por el aumento de sueldo. Puede ser <code>null</code>.
     * @param empleado            a quien se le va a aumentar el {@link Sueldo}. Ya estaba previamente persistido.
     * @param enlaceTransaccional para asegurar la atomicidad de la transacci&oacute;n.
     * @param locale              para posteriormente determinar la moneda.
     *
     * @exception com.psiqueware.alheli.manager.ManagerException
     *             en caso de no poder completar la operaci&oacute;n.
     * @noinspection FeatureEnvy
     */
    void aumentarSueldo ( BigDecimal cantidad, RazonSueldo razonSueldo, Locale locale, Empleado empleado, EnlaceTransaccional enlaceTransaccional ) throws ManagerException;

    /**
     * Busca un {@link Empleado} en base a su id.
     *
     * @param idEmpleado          identificador &uacute;nico del {@link Empleado} buscado.
     * @param enlaceTransaccional para asegurar la atomicidad de la transacci&oacute;n.
     *
     * @return {@link Empleado} en caso de encontralo; <code>null</code> en caso contrario.
     *
     * @exception com.psiqueware.alheli.manager.ManagerException
     *             en caso de no poder completar la operaci&oacute;n.
     */
    Empleado buscarEmpleadoPorId ( Long idEmpleado, EnlaceTransaccional enlaceTransaccional ) throws ManagerException;
}
